// 定义段选引脚
const int segPins[] = {2, 3, 4, 5, 6, 7, 8, 9};
// 定义位选引脚
const int digitPins[] = {10, 11, 12, 13};

// 共阴极数码管显示0 - 9的段码
const byte digitSegments[] = {
  B00111111, // 0
  B00000110, // 1
  B01011011, // 2
  B01001111, // 3
  B01100110, // 4
  B01101101, // 5
  B01111101, // 6
  B00000111, // 7
  B01111111, // 8
  B01101111  // 9
};

void setup() {
  // 将段选引脚设置为输出模式
  for (int i = 0; i < 8; i++) {
    pinMode(segPins[i], OUTPUT);
  }
  // 将位选引脚设置为输出模式
  for (int i = 0; i < 4; i++) {
    pinMode(digitPins[i], OUTPUT);
  }
}

void loop() {
  for (int digit = 0; digit < 4; digit++) {
    // 选择要显示的数码管位置
    selectDigit(digit);
    // 显示对应的数字
    displayNumber(digit);
    delay(1);
  }
}

// 选择要显示的数码管位置
void selectDigit(int digit) {
  for (int i = 0; i < 4; i++) {
    if (i == digit) {
      digitalWrite(digitPins[i], LOW); // 选中当前数码管
    } else {
      digitalWrite(digitPins[i], HIGH); // 关闭其他数码管
    }
  }
}

// 显示对应的数字
void displayNumber(int number) {
  byte segments = digitSegments[number];
  for (int i = 0; i < 8; i++) {
    digitalWrite(segPins[i], bitRead(segments, i));
  }
}    